类的继承
Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。派生类的定义如下所示:
python
class <DerivedClassName>(<BaseClassName>):
<statements>
子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
BaseClassName(实例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
python
class <DerivedClassName>(<modname.BaseClassName>):
<statements>
一般类在继承父类 BaseClassName 之后,还会增加一些自身新的属性和方法。
python
#类的定义
class Animal:
name = 'animal'
def talk(self):
print('wow')
class Duck(Animal): #继承Animal类,拥有name属性和talk方法
legs_count = 2
class Dog(Animal): #继承Animal类,拥有name属性和talk方法
legs_count = 4
#类的实例化
duck = Duck()
dog = Dog()
print('duck legs count:', duck.legs_count) #输出2
print('dog legs count:', dog.legs_count) #输出4
duck.talk() #输出wow
dog.talk() #输出wow`
方法重写
如果父类 BaseClassName 满足不了子类的要求,还可以重新实现父类的方法,就是方法重写
python
#类的定义
class Animal:
name = 'animal'
def talk(self):
print('wow')
class Duck(Animal): #继承Animal类,拥有name属性和talk方法
legs_count = 2
def talk(self): #覆盖Animal的talk方法
print('gaga')
class Dog(Animal): #继承Animal类,拥有name属性和talk方法
legs_count = 4
def talk(self): #覆盖Animal的talk方法
print('wang')
#类的实例化
duck = Duck()
dog = Dog()
duck.talk() #输出gaga
dog.talk() #输出wang`
项目式学习与应用
使用类的概念,构造出一个小游戏:
- 游戏里有一个玩家和地图,玩家出生在地图的左上角。
- 地图中有
.
和#
,.
代表可以通过的路径点,#
代表不能通过的障碍点。 - 玩家拥有姓名、能量值和生命值。
- 通过输入 wasd 控制玩家上下左右移动。
- 玩家每移动一步,减少 1 个能量值,如果移动到
#
障碍点,返回,并且生命值减 1。 - 玩家能量值或者生命值为 0 时,玩家死亡,游戏结束。
- 玩家如果到达右下角出口,胜利,游戏结束。
Player 类的定义
python
class Player:
name = ''
energy = 10
pos = [0,0]
hp = 3
def __init__(self,name):
self.name = name
def setPos(self, row, col):
self.pos[0] = row
self.pos[1] = col
self.energy -= 1
def damage(self, point = -1):
self.hp += point
Game 类的定义
python
class Game:
player = Player('')
#三个单引号可以实现多行字符串,用splitlines的方法,转换为列表
grid = '''..###
#....
#.#.#
#.#.#
#.#..'''
current_grid = []
def __init__(self,name):
self.player.name = name
self.updateGrid()
def updateGrid(self):
self.current_grid = self.grid.splitlines()
for i in range(len(self.current_grid)):
self.current_grid[i] = list(self.current_grid[i])
self.setPlayer(self.player.pos[0],self.player.pos[1])
def setPlayer(self, row, col):
self.current_grid[row][col] = 'P'
def playerMove(self,row,col):
if self.current_grid[row][col] == '#':
self.player.damage(-1)
if self.player.hp <= 0:
print('Die')
exit()
else:
self.player.setPos(row,col)
def printGrid(self):
print('Player:',self.player.name," energy:", self.player.energy," hp:",self.player.hp)
for i in self.current_grid:
for j in i:
print(j,end='')
print()
def gameInput(self):
move = input()
row,col = self.player.pos
if move == 'w':
self.playerMove(row-1,col)
elif move == 's':
self.playerMove(row+1,col)
elif move == 'a':
self.playerMove(row,col-1)
elif move == 'd':
self.playerMove(row,col+1)
self.updateGrid()
def checkEnd(self):
if self.player.pos[0] == len(self.current_grid) - 1 and self.player.pos[1] == len(self.current_grid[0]) - 1:
print('Bingo')
return True
if self.player.energy <= 0:
print('Die')
return True
return False
程序主体
python
name = input()
game = Game(name)
game.printGrid()
while True:
game.gameInput()
game.printGrid()
if game.checkEnd():
break